class Spam():
    num_instances = 0

    @classmethod
    def count(cls):
        print(f"cls:{cls}")
        cls.num_instances += 1

    def __init__(self):
        print("Spam init")
        self.count()


class Sub(Spam):
    num_instances = 0


class Other(Spam):
    num_instances = 0


# 每次 Spam 实例，Spam 的类变量 num_instances 就会加 1
x = Spam()  # 这时候 Spam 类变量 为 1
y1 = Sub()
"""
这个时候，在 count(cls) 打印出来的 cls 是 <class '__main__.Sub'>
也就说，classmethon 的 cls 参数，对应的是本类的 class
所以，这个时候 Sub.num_instances = 1
"""
y2 = Sub()  # Sub.num_instances = 2

z1, z2, z3 = Other(), Other(), Other()  # 以此类推，Other.num_instances 执行三次之后就是 3

# 因为 x y z 是类的实例，指向的类变量事一个
print(x.num_instances, y1.num_instances, z1.num_instances)   # 1 2 3
print(Spam.num_instances, Sub.num_instances, Other.num_instances)  # 1 2 3
